#include"config.h"
#include<inttypes.h>
 unsigned int mcrc_tab[256] ={
  0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
	0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
	0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
	0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
	0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
	0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
	0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
	0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
	0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
	0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
	0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
	0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
	0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
	0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
	0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
	0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
	0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
	0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
	0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
	0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
	0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
	0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
	0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
	0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
	0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
	0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
	0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
	0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
	0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
	0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
	0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
	0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
  };	
 const uint32_t crc32_stm32[256] = {
  0x00000000L,0x04C11DB7L,0x09823B6EL,0x0D4326D9L,0x130476DCL,0x17C56B6BL,0x1A864DB2L,0x1E475005L,
  0x2608EDB8L,0x22C9F00FL,0x2F8AD6D6L,0x2B4BCB61L,0x350C9B64L,0x31CD86D3L,0x3C8EA00AL,0x384FBDBDL,
  0x4C11DB70L,0x48D0C6C7L,0x4593E01EL,0x4152FDA9L,0x5F15ADACL,0x5BD4B01BL,0x569796C2L,0x52568B75L,
  0x6A1936C8L,0x6ED82B7FL,0x639B0DA6L,0x675A1011L,0x791D4014L,0x7DDC5DA3L,0x709F7B7AL,0x745E66CDL,
  0x9823B6E0L,0x9CE2AB57L,0x91A18D8EL,0x95609039L,0x8B27C03CL,0x8FE6DD8BL,0x82A5FB52L,0x8664E6E5L,
  0xBE2B5B58L,0xBAEA46EFL,0xB7A96036L,0xB3687D81L,0xAD2F2D84L,0xA9EE3033L,0xA4AD16EAL,0xA06C0B5DL,
  0xD4326D90L,0xD0F37027L,0xDDB056FEL,0xD9714B49L,0xC7361B4CL,0xC3F706FBL,0xCEB42022L,0xCA753D95L,
  0xF23A8028L,0xF6FB9D9FL,0xFBB8BB46L,0xFF79A6F1L,0xE13EF6F4L,0xE5FFEB43L,0xE8BCCD9AL,0xEC7DD02DL,
  0x34867077L,0x30476DC0L,0x3D044B19L,0x39C556AEL,0x278206ABL,0x23431B1CL,0x2E003DC5L,0x2AC12072L,
  0x128E9DCFL,0x164F8078L,0x1B0CA6A1L,0x1FCDBB16L,0x018AEB13L,0x054BF6A4L,0x0808D07DL,0x0CC9CDCAL,
  0x7897AB07L,0x7C56B6B0L,0x71159069L,0x75D48DDEL,0x6B93DDDBL,0x6F52C06CL,0x6211E6B5L,0x66D0FB02L,
  0x5E9F46BFL,0x5A5E5B08L,0x571D7DD1L,0x53DC6066L,0x4D9B3063L,0x495A2DD4L,0x44190B0DL,0x40D816BAL,
  0xACA5C697L,0xA864DB20L,0xA527FDF9L,0xA1E6E04EL,0xBFA1B04BL,0xBB60ADFCL,0xB6238B25L,0xB2E29692L,
  0x8AAD2B2FL,0x8E6C3698L,0x832F1041L,0x87EE0DF6L,0x99A95DF3L,0x9D684044L,0x902B669DL,0x94EA7B2AL,
  0xE0B41DE7L,0xE4750050L,0xE9362689L,0xEDF73B3EL,0xF3B06B3BL,0xF771768CL,0xFA325055L,0xFEF34DE2L,
  0xC6BCF05FL,0xC27DEDE8L,0xCF3ECB31L,0xCBFFD686L,0xD5B88683L,0xD1799B34L,0xDC3ABDEDL,0xD8FBA05AL,
  0x690CE0EEL,0x6DCDFD59L,0x608EDB80L,0x644FC637L,0x7A089632L,0x7EC98B85L,0x738AAD5CL,0x774BB0EBL,
  0x4F040D56L,0x4BC510E1L,0x46863638L,0x42472B8FL,0x5C007B8AL,0x58C1663DL,0x558240E4L,0x51435D53L,
  0x251D3B9EL,0x21DC2629L,0x2C9F00F0L,0x285E1D47L,0x36194D42L,0x32D850F5L,0x3F9B762CL,0x3B5A6B9BL,
  0x0315D626L,0x07D4CB91L,0x0A97ED48L,0x0E56F0FFL,0x1011A0FAL,0x14D0BD4DL,0x19939B94L,0x1D528623L,
  0xF12F560EL,0xF5EE4BB9L,0xF8AD6D60L,0xFC6C70D7L,0xE22B20D2L,0xE6EA3D65L,0xEBA91BBCL,0xEF68060BL,
  0xD727BBB6L,0xD3E6A601L,0xDEA580D8L,0xDA649D6FL,0xC423CD6AL,0xC0E2D0DDL,0xCDA1F604L,0xC960EBB3L,
  0xBD3E8D7EL,0xB9FF90C9L,0xB4BCB610L,0xB07DABA7L,0xAE3AFBA2L,0xAAFBE615L,0xA7B8C0CCL,0xA379DD7BL,
  0x9B3660C6L,0x9FF77D71L,0x92B45BA8L,0x9675461FL,0x8832161AL,0x8CF30BADL,0x81B02D74L,0x857130C3L,
  0x5D8A9099L,0x594B8D2EL,0x5408ABF7L,0x50C9B640L,0x4E8EE645L,0x4A4FFBF2L,0x470CDD2BL,0x43CDC09CL,
  0x7B827D21L,0x7F436096L,0x7200464FL,0x76C15BF8L,0x68860BFDL,0x6C47164AL,0x61043093L,0x65C52D24L,
  0x119B4BE9L,0x155A565EL,0x18197087L,0x1CD86D30L,0x029F3D35L,0x065E2082L,0x0B1D065BL,0x0FDC1BECL,
  0x3793A651L,0x3352BBE6L,0x3E119D3FL,0x3AD08088L,0x2497D08DL,0x2056CD3AL,0x2D15EBE3L,0x29D4F654L,
  0xC5A92679L,0xC1683BCEL,0xCC2B1D17L,0xC8EA00A0L,0xD6AD50A5L,0xD26C4D12L,0xDF2F6BCBL,0xDBEE767CL,
  0xE3A1CBC1L,0xE760D676L,0xEA23F0AFL,0xEEE2ED18L,0xF0A5BD1DL,0xF464A0AAL,0xF9278673L,0xFDE69BC4L,
  0x89B8FD09L,0x8D79E0BEL,0x803AC667L,0x84FBDBD0L,0x9ABC8BD5L,0x9E7D9662L,0x933EB0BBL,0x97FFAD0CL,
  0xAFB010B1L,0xAB710D06L,0xA6322BDFL,0xA2F33668L,0xBCB4666DL,0xB8757BDAL,0xB5365D03L,0xB1F740B4L
};
   
        unsigned int mCRC_gen(char scrData[],int datalength)
        {
            // CCITT
        //   unsigned  char m[] = {49};
           unsigned int com = 0;
           unsigned int i = 0;
           for (i = 0; i < datalength; i++)
            {
                com = mcrc_tab[((com >> 8) ^ scrData[i+1]) & 0xFF] ^ (com << 8);
                com = com & 0x00ffff;
            }           
           return com;
        }
        int mECC(char data[],int datalength)
	  		{	     
		      int ret = 0x7F;
		      int i = 0;
		      for (i = 0; i < datalength; i++)
		      {
		         ret = ret^data[i];
		      }
		      return ret;
	   		}
        
unsigned int CaculateCRC(char data[],UInt16 dataLength)
        {
            int s_Crc16Value = 0x1021;
            unsigned int crcResult = 0;
            int validLength = dataLength;
            crcResult = (UInt16)((data[validLength - 1] << 8) + data[validLength - 2]);
            int totalBit = (validLength - 2) * 8,i;
            for (i = totalBit - 1; i >= 8; i--)
            {
                int a = (i / 8);
                int b = (i % 8);
                int nextBit =(UInt16)((data[a] >> b) & 0x01);
                if (crcResult >= 32768)
                {
                    crcResult = (UInt16)(((crcResult - 32768) << 1) + nextBit);
                    crcResult =(UInt16)(crcResult ^ s_Crc16Value);
                }
                else
                {
                    crcResult = (UInt16)((crcResult << 1) + nextBit);
                }
            }
            return crcResult;
        
      }
      
uint32_t get_crc32_stm32(uint32_t crc,uint8_t *crcBuff, uint32_t crcLen) 
{
	uint32_t i;
  for(i = 0; i < crcLen; i ++) {
    crc = (crc << 8) ^ crc32_stm32[(crc >> 24) ^ crcBuff[i]];
		}
 return crc;
}
